#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
区域管理器模块

提供图像剪切区域的管理功能
"""

import os

class RegionManager:
    """区域管理器类，负责管理剪切区域"""
    
    def __init__(self):
        """初始化区域管理器"""
        self.regions = []  # 存储区域列表
        self.current_index = -1  # 当前选中的区域索引
        self.include_coordinates = True  # 是否在文件名中包含坐标信息
        self.current_image_name = ""  # 当前图片文件名（不含扩展名）
    
    def set_current_image(self, image_path):
        """设置当前图片名称
        
        参数:
            image_path (str): 图片路径
        """
        self.current_image_name = os.path.splitext(os.path.basename(image_path))[0]
    
    def format_region_name(self, x, y, w, h):
        """格式化区域名称
        
        参数:
            x (int): X坐标
            y (int): Y坐标
            w (int): 宽度
            h (int): 高度
            
        返回:
            str: 格式化的区域名称
        """
        if not self.current_image_name:
            return f"region_x{x}_y{y}_w{w}_h{h}"
        return f"{self.current_image_name}_x{x}_y{y}_w{w}_h{h}"
    
    def add_region(self, x, y, w, h, name=None):
        """添加新区域
        
        参数:
            x (int): X坐标
            y (int): Y坐标
            w (int): 宽度
            h (int): 高度
            name (str, optional): 区域名称，如果未提供则自动生成
            
        返回:
            int: 新区域的索引
        """
        # 如果没有提供名称，使用格式化的名称
        if name is None or name.startswith("region"):
            name = self.format_region_name(x, y, w, h)
            
        # 添加区域
        self.regions.append((x, y, w, h, name))
        
        # 返回新区域的索引
        return len(self.regions) - 1
    
    def update_region(self, index, x=None, y=None, width=None, height=None, name=None):
        """更新区域
        
        参数:
            index (int): 区域索引
            x (int, optional): 新的X坐标
            y (int, optional): 新的Y坐标
            width (int, optional): 新的宽度
            height (int, optional): 新的高度
            name (str, optional): 新的名称
        """
        if 0 <= index < len(self.regions):
            region = list(self.regions[index])
            
            if x is not None:
                region[0] = x
            if y is not None:
                region[1] = y
            if width is not None:
                region[2] = width
            if height is not None:
                region[3] = height
            if name is not None:
                region[4] = name
            else:
                # 如果没有提供新名称，但坐标或尺寸发生变化，则更新默认名称
                if x is not None or y is not None or width is not None or height is not None:
                    prefix = self.current_image_name if self.current_image_name else "region"
                    region[4] = f"{prefix}_x{region[0]}_y{region[1]}_w{region[2]}_h{region[3]}"
            
            self.regions[index] = tuple(region)
    
    def remove_region(self, index):
        """删除区域
        
        参数:
            index (int): 区域索引
        """
        if 0 <= index < len(self.regions):
            self.regions.pop(index)
            if self.current_index >= len(self.regions):
                self.current_index = len(self.regions) - 1
    
    def get_region(self, index):
        """获取区域
        
        参数:
            index (int): 区域索引
            
        返回:
            tuple: 区域数据 (x, y, width, height, name) 或 None
        """
        if 0 <= index < len(self.regions):
            return self.regions[index]
        return None
    
    def get_all_regions(self):
        """获取所有区域
        
        返回:
            list: 区域列表
        """
        return self.regions
    
    def get_region_count(self):
        """获取区域数量
        
        返回:
            int: 区域数量
        """
        return len(self.regions)
    
    def clear_regions(self):
        """清除所有区域"""
        self.regions.clear()
        self.current_index = -1
    
    def set_include_coordinates(self, include):
        """设置是否在文件名中包含坐标信息
        
        参数:
            include (bool): 是否包含坐标信息
        """
        self.include_coordinates = include
    
    def format_region_filename(self, index):
        """格式化区域文件名
        
        参数:
            index (int): 区域索引
            
        返回:
            str: 格式化后的文件名
        """
        region = self.get_region(index)
        if not region:
            return ""
            
        x, y, w, h, name = region[:5]
        
        if self.include_coordinates:
            # 包含坐标信息的格式：图片文件名_x坐标_y坐标_w宽_h高
            prefix = self.current_image_name if self.current_image_name else "region"
            return f"{prefix}_x{x}_y{y}_w{w}_h{h}"
        else:
            return name
    
    def get_current_region(self):
        """获取当前选中的区域
        
        返回:
            tuple: 当前区域信息 (x, y, width, height, name) 或None
        """
        return self.get_region(self.current_index)
    
    def select_region(self, index):
        """选择指定索引的区域
        
        参数:
            index (int): 区域索引
            
        返回:
            bool: 选择成功返回True，否则False
        """
        if not self._validate_index(index):
            return False
            
        self.current_index = index
        return True
    
    def get_include_coordinates(self):
        """获取是否在文件名中包含坐标
        
        返回:
            bool: 是否包含坐标
        """
        return self.include_coordinates
    
    def _validate_index(self, index):
        """验证索引是否有效
        
        参数:
            index (int): 区域索引
            
        返回:
            bool: 索引有效返回True，否则False
        """
        return 0 <= index < len(self.regions)
    
    def set_region_property(self, region_index, property_name, value):
        """设置区域属性
        
        参数:
            region_index (int): 区域索引
            property_name (str): 属性名称
            value: 属性值
            
        返回:
            bool: 是否成功设置
        """
        if region_index < 0 or region_index >= len(self.regions):
            return False
            
        # 确保区域具有属性字典
        if len(self.regions[region_index]) <= 5:
            # 创建新的区域元组，添加属性字典
            region = list(self.regions[region_index])
            if len(region) == 5:  # 只有 x, y, w, h, name
                region.append({})
            
            # 设置属性
            region[5][property_name] = value
            
            # 更新区域
            self.regions[region_index] = tuple(region)
        else:
            # 已有属性字典，直接更新
            region = list(self.regions[region_index])
            region[5][property_name] = value
            self.regions[region_index] = tuple(region)
            
        return True
    
    def get_region_property(self, region_index, property_name, default=None):
        """获取区域属性
        
        参数:
            region_index (int): 区域索引
            property_name (str): 属性名称
            default: 默认值（如果属性不存在）
            
        返回:
            属性值或默认值
        """
        if region_index < 0 or region_index >= len(self.regions):
            return default
            
        region = self.regions[region_index]
        
        # 检查是否有属性字典
        if len(region) <= 5:
            return default
            
        # 获取属性值
        properties = region[5]
        return properties.get(property_name, default)
    
    def get_region_index(self, region_data):
        """根据区域数据获取区域索引
        
        参数:
            region_data (tuple): 区域数据 (x, y, w, h, name)
            
        返回:
            int: 区域索引，未找到返回-1
        """
        # 确保区域数据有效
        if not region_data or len(region_data) < 5:
            return -1
            
        # 检查区域是否存在于列表中
        for i, region in enumerate(self.regions):
            # 比较关键属性：x, y, width, height, name
            if (region[0] == region_data[0] and 
                region[1] == region_data[1] and 
                region[2] == region_data[2] and 
                region[3] == region_data[3] and 
                region[4] == region_data[4]):
                return i
                
        return -1 